-- MonsterAnimation
-- Created by chengb Jan/14/2014
-- 怪物动画管理

-- 怪物动作类型
MONSTER_ACTION_IDLE         = 1;    -- 待机
MONSTER_ACTION_DAMAGED      = 2;    -- 受创
MONSTER_ACTION_DIE          = 3;    -- 死亡
MONSTER_ACTION_ATTACK       = 4;    -- 攻击
MONSTER_ACTION_STRIKE_BACK  = 5;    -- 反击
MONSTER_ACTION_APPEAR       = 6;    -- 出场
MONSTER_ACTION_CAST         = 7;    -- 施法
MONSTER_ACTION_USER_DEFINED = 8;    -- 自定义
MONSTER_ACTION_STOLENED     = 9;    -- 被偷窃
MONSTER_ACTION_ACCOMPANY    = 10;    -- 交替伴生

-- 所有的怪物动作
ALL_MONSTER_ACTIONS = {
    MONSTER_ACTION_IDLE,         -- 待机
    MONSTER_ACTION_DAMAGED,      -- 受创
    MONSTER_ACTION_DIE,          -- 死亡
    MONSTER_ACTION_ATTACK,       -- 攻击
    MONSTER_ACTION_STRIKE_BACK,  -- 反击
    MONSTER_ACTION_APPEAR,       -- 出场
    MONSTER_ACTION_CAST,         -- 施法
    MONSTER_ACTION_USER_DEFINED, -- 自定义
    MONSTER_ACTION_STOLENED,     -- 被偷窃
    MONSTER_ACTION_ACCOMPANY,    -- 交替伴生
}

-- 当前动作类型
local currentActionType = MONSTER_ACTION_IDLE;

-- MonsterAnimation继承自Node
MonsterAnimation = class("MonsterAnimation", function()
    return cc.Node:create();
end);

function MonsterAnimation.create(filePath)
    return MonsterAnimation.new(filePath);
end

-- 构造函数
-- @param filePath : 动画文件路径
function MonsterAnimation:ctor(filePath)
    -- 载入动画
    local node, action = AnimationCacheM.createAnimationNodeAndAction(filePath);

    self.node = node;
    self.action = action;

    node:runAction(action);
    self:addChild(node);

    self.filePath = filePath;

    self.hasDestroyed = false;

    -- 界面析构后，需要清理下
    self:registerScriptHandler(function(eventType)
        if eventType == "exit" then
            self:destroy();
        end
    end);
end

-----------------------------
-- 播放
-- @param actionType   动作类型
-- @param loop         是否循环播放
-- @param startIndex   起始帧
-- @param endIndex     结束帧
-- @param speed        播放速度
function MonsterAnimation:play(actionType, loop, startIndex, endIndex, speed)
    if nil == loop then
        loop = false;
    end

    --trace("MonsterAnimation", "actionType = " .. actionType);

    if table.indexOf(ALL_MONSTER_ACTIONS, actionType) < 0 then
        cclog("无法播放怪物动作，未知的怪物动作类型：%s", tostring(actionType));
        return;
    end

    -- 播放
    currentActionType = actionType;
    self.action:setTimeSpeed(speed);
    self.action:gotoFrameAndPlay(startIndex, endIndex, loop);
end

-- 获取播放速度
function MonsterAnimation:getSpeed(speed)
    return self.action:getTimeSpeed();
end

-- 设置播放速度
function MonsterAnimation:setSpeed(speed)
    self.action:setTimeSpeed(speed);
end

-- 暂停播放
function MonsterAnimation:pause()
    self.action:pause();
end

-- 开始播放
function MonsterAnimation:resume()
    self.action:resume();
end

-- 获取当前的动作类型
function MonsterAnimation:getActionType()
    return currentActionType;
end

-- 销毁动画
function MonsterAnimation:destroy()
    if not self.hasDestroyed then
        self:removeChild(self.node);
        AnimationCacheM.freeAnimationNodeAndAction(self.filePath, self.node, self.action);
        self.hasDestroyed = true;

        self.node = nil;
        self.action = nil;
        self.filePath = nil;
    end
end

